﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Xml.Serialization;
using System.IO;

namespace GesPro
{
    /// <summary>
    /// Classe s'occupant de la gestion du classeur d'employé
    /// </summary>
    class ClasseurEmployes
    {

        public enum TypeRecherche
        {
            Nom,
            Code
        };
        private List<Employe> Classeur = new List<Employe>();
        /// <summary>
        /// Permet l'ajout d'un employé au classeur.
        /// </summary>
        /// <param name="nom">Nom de l'employé</param>
        /// <param name="titre">Titre/Emploi de l'utilisateur</param>
        /// <param name="numero">Numéro/Code de l'employé</param>
        /// <param name="acces">Niveau d'accès</param>
        /// <param name="utilisateur">Nom d'utilisateur pour la connexion</param>
        /// <param name="mdp">Mot de passe lié à l'utilisateur</param>
        /// <param name="courriel">Courriel de l'employé</param>
        /// <param name="telephone">Téléphone de l'employé</param>
        /// <param name="note">Notes spéciales sur l'employé</param>
        public void AjouterEmploye(string nom,
                            string titre,
                            string numero,
                            int acces,
                            string utilisateur,
                            string mdp,
                            string courriel,
                            string telephone,
                            string note)
        {
            ChargerEmploye();
            
            Employe employe = new Employe();

            employe.Nom = Crypto.EncryptStringAES(nom, AccesPreferences.ObtenirMotEncodage());
            employe.Titre = Crypto.EncryptStringAES(titre, AccesPreferences.ObtenirMotEncodage());
            employe.Numero = Crypto.EncryptStringAES(numero, AccesPreferences.ObtenirMotEncodage());
            employe.Acces = acces;
            employe.Utilisateur = Crypto.EncryptStringAES(utilisateur, AccesPreferences.ObtenirMotEncodage());
            employe.Mdp = Crypto.EncryptStringAES(mdp, AccesPreferences.ObtenirMotEncodage());
            employe.Courriel = Crypto.EncryptStringAES(courriel, AccesPreferences.ObtenirMotEncodage());
            employe.Telephone = Crypto.EncryptStringAES(telephone, AccesPreferences.ObtenirMotEncodage());
            employe.Note = Crypto.EncryptStringAES(note, AccesPreferences.ObtenirMotEncodage());

            Classeur.Add(employe);

            SauvegarderEmploye();
        }

        /// <summary>
        /// Supprime l'utilisateur correspondant au nom d'utilisateur ou numéro d'employé
        /// </summary>
        /// <param name="Utilisateur">Nom d'utilisateur à effacer</param>
        /// <param name="numero">Numréo de l'utilisateur à effacer</param>
        public void EffacerEmploye(string Utilisateur, string numero)
        {
            ChargerEmploye();
            for (int i = 0; i < Classeur.Count; i++)
            {

                if (Crypto.DecryptStringAES(Classeur[i].Utilisateur, AccesPreferences.ObtenirMotEncodage()) == Utilisateur &
                    Crypto.DecryptStringAES(Classeur[i].Numero, AccesPreferences.ObtenirMotEncodage()) == numero)
                {
                    Classeur.RemoveAt(i);
                } 
            }

            SauvegarderEmploye();
        }
        /// <summary>
        /// Modifier les informations d'un employé existant.
        /// </summary>
        /// <param name="utilisateur_old">Nom d'utilisateur</param>
        /// <param name="numero_old">Numéro/code de l'employé </param>
        /// <param name="nom">Nouveau nom de l'employé</param>
        /// <param name="titre">Nouveau titre de l'employé</param>
        /// <param name="numero">Nouveau numéro/code de l'employé</param>
        /// <param name="acces">Nouveau niveau d'accès</param>
        /// <param name="utilisateur">Nouveau nom d'utilisateur</param>
        /// <param name="mdp">Nouveau mot de passe</param>
        /// <param name="courriel">Nouveau courriel</param>
        /// <param name="telephone">Nouveau numéro de téléphone</param>
        /// <param name="note">Nouvelle notes </param>
        public void ModifierEmploye(string utilisateur_old,
                            string numero_old,
                            string nom,
                            string titre,
                            string numero,
                            int acces,
                            string utilisateur,
                            string mdp,
                            string courriel,
                            string telephone,
                            string note)
        {

            ChargerEmploye();

            for (int i = 0; i < Classeur.Count; i++)
            {

                if (Crypto.DecryptStringAES(Classeur[i].Utilisateur, AccesPreferences.ObtenirMotEncodage()) == utilisateur_old &
                    Crypto.DecryptStringAES(Classeur[i].Numero, AccesPreferences.ObtenirMotEncodage()) == numero_old )
                {
                    Classeur[i].Nom = Crypto.EncryptStringAES(nom, AccesPreferences.ObtenirMotEncodage());
                    Classeur[i].Titre = Crypto.EncryptStringAES(titre, AccesPreferences.ObtenirMotEncodage());
                    Classeur[i].Numero = Crypto.EncryptStringAES(numero, AccesPreferences.ObtenirMotEncodage());
                    Classeur[i].Acces = acces;
                    Classeur[i].Utilisateur = Crypto.EncryptStringAES(utilisateur, AccesPreferences.ObtenirMotEncodage());
                    Classeur[i].Mdp = Crypto.EncryptStringAES(mdp, AccesPreferences.ObtenirMotEncodage());
                    Classeur[i].Courriel = Crypto.EncryptStringAES(courriel, AccesPreferences.ObtenirMotEncodage());
                    Classeur[i].Telephone = Crypto.EncryptStringAES(telephone, AccesPreferences.ObtenirMotEncodage());
                    Classeur[i].Note = Crypto.EncryptStringAES(note, AccesPreferences.ObtenirMotEncodage());
                }
            }

            SauvegarderEmploye();
        }
        
        /// <summary>
        /// Sauvegarder la liste des employés dans le fichier classeur.
        /// </summary>
        public void SauvegarderEmploye()
        { 
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Employe>));
            using (StreamWriter writer = new StreamWriter(AccesPreferences.CheminClasseurEmployes() + "\\ClasseurEmployés.xml"))
            {
                xmlSerializer.Serialize(writer, Classeur);
            }
        }
        /// <summary>
        /// Charger la liste des employés du fichier classeur.
        /// </summary>
        public void ChargerEmploye()
        {
            
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Employe>));
            if (!File.Exists(AccesPreferences.CheminClasseurEmployes() + "\\ClasseurEmployés.xml"))
            {
                using (StreamWriter writer = new StreamWriter(AccesPreferences.CheminClasseurEmployes() + "\\ClasseurEmployés.xml"))
                {
                    List<Employe> liste = new List<Employe>();
                    liste.Add(new Employe(Crypto.EncryptStringAES("Administrateur", AccesPreferences.ObtenirMotEncodage()),
                                            Crypto.EncryptStringAES(string.Empty, AccesPreferences.ObtenirMotEncodage()),
                                            Crypto.EncryptStringAES(string.Empty, AccesPreferences.ObtenirMotEncodage()),
                                            3,
                                            Crypto.EncryptStringAES("admin", AccesPreferences.ObtenirMotEncodage()),
                                            Crypto.EncryptStringAES("admin", AccesPreferences.ObtenirMotEncodage()),
                                            Crypto.EncryptStringAES(string.Empty, AccesPreferences.ObtenirMotEncodage()),
                                            Crypto.EncryptStringAES(string.Empty, AccesPreferences.ObtenirMotEncodage()),
                                            Crypto.EncryptStringAES(string.Empty, AccesPreferences.ObtenirMotEncodage())));
                    xmlSerializer.Serialize(writer, liste);
                }

            }

            using (StreamReader reader = new StreamReader(AccesPreferences.CheminClasseurEmployes() + "\\ClasseurEmployés.xml"))
            {
                Classeur = xmlSerializer.Deserialize(reader) as List<Employe>;

            }
        }
        /// <summary>
        /// Obtenir la liste des employés.
        /// </summary>
        /// <returns>Liste des employés</returns>
        public List<Employe> ObtenirEmployes()
        {
            ChargerEmploye();
            foreach (Employe employe in Classeur)
            {
                employe.Nom = Crypto.DecryptStringAES(employe.Nom, AccesPreferences.ObtenirMotEncodage());
                employe.Titre = Crypto.DecryptStringAES(employe.Titre, AccesPreferences.ObtenirMotEncodage());
                employe.Numero = Crypto.DecryptStringAES(employe.Numero, AccesPreferences.ObtenirMotEncodage());
                employe.Utilisateur = Crypto.DecryptStringAES(employe.Utilisateur, AccesPreferences.ObtenirMotEncodage());
                employe.Mdp = Crypto.DecryptStringAES(employe.Mdp, AccesPreferences.ObtenirMotEncodage());
                employe.Courriel = Crypto.DecryptStringAES(employe.Courriel, AccesPreferences.ObtenirMotEncodage());
                employe.Telephone = Crypto.DecryptStringAES(employe.Telephone, AccesPreferences.ObtenirMotEncodage());
                employe.Note = Crypto.DecryptStringAES(employe.Note, AccesPreferences.ObtenirMotEncodage());
            }
            return Classeur;
        }
        /// <summary>   
        /// Obtenir une fiche d'employé en particulier. 
        /// </summary>
        /// <param name="reference">Référence sur l'employé recherché. (Nom d'utilisateur ou numéro d'employé)</param>
        /// <returns>Fiche de l'employé</returns>
        public Employe ObtenirEmploye(string reference)
        {
            Employe emp = null; 
            ChargerEmploye();

            foreach (Employe employe in Classeur)
            {
                if (Crypto.DecryptStringAES(employe.Nom, AccesPreferences.ObtenirMotEncodage()) == reference | Crypto.DecryptStringAES(employe.Numero, AccesPreferences.ObtenirMotEncodage()) == reference)
                {
                    employe.Nom = Crypto.DecryptStringAES(employe.Nom, AccesPreferences.ObtenirMotEncodage());
                    employe.Titre = Crypto.DecryptStringAES(employe.Titre, AccesPreferences.ObtenirMotEncodage());
                    employe.Numero = Crypto.DecryptStringAES(employe.Numero, AccesPreferences.ObtenirMotEncodage());
                    employe.Utilisateur = Crypto.DecryptStringAES(employe.Utilisateur, AccesPreferences.ObtenirMotEncodage());
                    employe.Mdp = Crypto.DecryptStringAES(employe.Mdp, AccesPreferences.ObtenirMotEncodage());
                    employe.Courriel = Crypto.DecryptStringAES(employe.Courriel, AccesPreferences.ObtenirMotEncodage());
                    employe.Telephone = Crypto.DecryptStringAES(employe.Telephone, AccesPreferences.ObtenirMotEncodage());
                    employe.Note = Crypto.DecryptStringAES(employe.Note, AccesPreferences.ObtenirMotEncodage());
                    emp = employe;
                    break;
                }

            }

            return emp;
        }
        /// <summary>
        /// Vérifier si un employé existe dans la liste d'employé.
        /// </summary>
        /// <param name="reference">Référence sur l'employé recherché. (Nom d'utilisateur ou numéro d'employé)</param>
        /// <param name="type">Type de recherche, soit par nom ou numéro</param>
        /// <returns>Vrai = l'employé existe ; Faux = l'employé n'existe pas</returns>
        public bool EmployeExiste(string reference, TypeRecherche type)
        {
            bool exist = false;
            ChargerEmploye();
            foreach (Employe employe in Classeur)
            {
                switch (type)
                {
                    case TypeRecherche.Nom:
                        if (Crypto.DecryptStringAES(employe.Nom, AccesPreferences.ObtenirMotEncodage()) == reference)
                        {
                            exist = true;
                        }
                        break;
                    case TypeRecherche.Code:
                        if (Crypto.DecryptStringAES(employe.Numero, AccesPreferences.ObtenirMotEncodage()) == reference)
                        {
                            exist = true;
                        }
                        break;
                    default:
                        break;
                }
                
            }
            return exist;
        }


        /// <summary>
        /// Recrypter le classeur avec un nouveau mot de passe dans les préférences
        /// </summary>
        /// <param name="OldMotEncodage">Ancien mot de passe</param>
        public void RecrypterClasseur(string OldMotEncodage)
        {
            ChargerEmploye();

            foreach (Employe employe in Classeur)
            {
                employe.Nom = Crypto.EncryptStringAES(  Crypto.DecryptStringAES(employe.Nom,OldMotEncodage) , AccesPreferences.ObtenirMotEncodage());
                employe.Titre = Crypto.EncryptStringAES(Crypto.DecryptStringAES(employe.Titre, OldMotEncodage), AccesPreferences.ObtenirMotEncodage());
                employe.Numero = Crypto.EncryptStringAES(Crypto.DecryptStringAES(employe.Numero, OldMotEncodage), AccesPreferences.ObtenirMotEncodage());
                employe.Utilisateur = Crypto.EncryptStringAES(Crypto.DecryptStringAES(employe.Utilisateur, OldMotEncodage), AccesPreferences.ObtenirMotEncodage());
                employe.Mdp = Crypto.EncryptStringAES(Crypto.DecryptStringAES(employe.Mdp, OldMotEncodage), AccesPreferences.ObtenirMotEncodage());
                employe.Courriel = Crypto.EncryptStringAES(Crypto.DecryptStringAES(employe.Courriel, OldMotEncodage), AccesPreferences.ObtenirMotEncodage());
                employe.Telephone = Crypto.EncryptStringAES(Crypto.DecryptStringAES(employe.Telephone, OldMotEncodage), AccesPreferences.ObtenirMotEncodage());
                employe.Note = Crypto.EncryptStringAES(Crypto.DecryptStringAES(employe.Note, OldMotEncodage), AccesPreferences.ObtenirMotEncodage());

            }

            SauvegarderEmploye();

        
        }

    }
}
